package com.trip.common.util;

import com.trip.common.dto.LoginDto;
import org.springframework.beans.factory.annotation.Autowired;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
import java.util.Random;

public class SendEmailAuthUtil {

    @Autowired
    private RedisUtil redisUtil;

    // 发件人邮箱、密码（如果是授权码，则填写授权码）
    private final static String from = "1159268923@qq.com";
    private final static String password = "cozbrlulcnhxigdj";
    // 收件人邮箱
    private final static String emailSubject = "滴滴打车";
    private static Properties props = null;
    private static Message message = null;
    static{
        props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议（JavaMail规范要求）
        props.put("mail.smtp.host", "smtp.qq.com"); // SMTP服务器地址
        props.put("mail.smtp.port", "465"); // SMTP服务器端口
        props.put("mail.smtp.auth", "true"); // 是否需要身份验证
        props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
        props.put("mail.smtp.ssl.enable", "true"); // 开启SSL
        props.put("mail.smtp.ssl.protocols", "TLSv1.2"); // 指定SSL版本
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        // 由于Properties默认不限制请求时间，可能会导致线程阻塞，所以指定请求时长
        props.setProperty("mail.smtp.connectiontimeout", "10000");// 与邮件服务器建立连接的时间限制
        props.setProperty("mail.smtp.timeout", "10000");// 邮件smtp读取的时间限制
        props.setProperty("mail.smtp.writetimeout", "10000");// 邮件内容上传的时间限制
        // 创建Session实例
        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(from, password);
            }
        });
        message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(from));
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }


    //发送邮件验证码方法
    public boolean send(String email) {
        //生成验证码
        String code = createCode();
        // 邮件服务器配置

        try {
            // 创建邮件实例

            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email));
            message.setSubject(emailSubject); // 邮件主题
            message.setText("尊敬的用户您好，感谢您使用滴滴打车平台。本次邮箱验证码为"+
                    code +",验证码有效时间为3分钟。若您没有进行操作，请忽略此邮件."); // 邮件正文

            // 发送邮件
            Transport.send(message);
            long l = redisUtil.addSetKey(email, code);
            if (l > 0){
                redisUtil.setExpire(email,60*3);
            }
            return true;
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

    //司机发送邮件提醒顾客支付
    public boolean unpaidOrders(String email,String order_num,java.sql.Timestamp time,String start,String end){

        try {
            // 创建邮件实例
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email));
            message.setSubject(emailSubject); // 邮件主题
            message.setText("尊敬的用户您好，感谢您使用滴滴打车平台。您有一笔出行订单尚未支付。订单编号为："+
                  order_num + ",出行日期为:" + time + ",出发地为：" + start + ",目的地为:" + end +
                    ",司机已发来催款，请尽快支付，避免影响后续出行。"  ); // 邮件正文
            Transport.send(message);
            return true;
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }





    //生成验证码
    private String createCode(){
        Random random = new Random();
        String code = "";
        for (int i = 0; i < 6; i++) {
            code += random.nextInt(10);
        }
        return code;
    }

    //校验验证码
    public int checkCode(LoginDto loginDto){
        //获取redis中的code
        //0:不存在；1：错误；2：正确
        String s = redisUtil.getSetKey(loginDto.getEmail());
        return "null".equals(s)?0:s.equals(loginDto.getPass_code())?1:2;
    }
}